package com.jc.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

import org.apache.commons.lang3.StringUtils;

/**
 * 格式化数值
 *
 * @author zhaoxing.liuzx
 *
 */
public class Numbers {

    private static final int DEFAULT_SCALE = 3;

    /**
     * 一位小数点
     */
    public static final String ONE_DE = "#.0";

    /**
     * 不需要小数点
     */
    public static final String NONE_DE = "#";

    public static String format(Double d) {
        if (d == null) {
            return null;
        }
        DecimalFormat df = new DecimalFormat("0.000");
        return df.format(d);
    }

    /**
     * @param d 原值
     * @param setFormatter 格式化字符串 示例："#.000"
     * @return 格式化后double值，默认精确到三位小数 *
     */
    public static Double format(Double d, String setFormatter) {
        if (d == null) {
            return null;
        }
        DecimalFormat df;
        if (StringUtils.isEmpty(setFormatter)) {
            df = new DecimalFormat("#.000");
        } else {
            df = new DecimalFormat(setFormatter);
        }
        return Double.valueOf(df.format(d));
    }

    /**
     * @param d 原值
     * @param defaultValue 默认值
     * @return double值 保留三位小数 四色五入 *
     */
    public static Double formatToDouble(BigDecimal d, Double defaultValue) {
        if (d == null) {
            return defaultValue;
        }
        return d.setScale(DEFAULT_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    
    /**
     * @param d 原值
     * @param scale 保留的小数位
     * @param defaultValue 默认值
     * @return double值 保留三位小数 四色五入 *
     */
    public static Double formatToDouble(BigDecimal d,int scale, Double defaultValue) {
        if (d == null) {
            return defaultValue;
        }
        if( scale < 0 ){
            scale = 0;
        }
        return d.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * @param d 原值
     * @param setFormatter 格式化字符串 示例："#.00"
     * @return 格式化后BigDecimal值，默认精确到三位小数
     */
    public static BigDecimal formatToDecimal(Double d, String setFormatter) {
        if (d == null) {
            return null;
        }
        DecimalFormat df;
        if (StringUtils.isEmpty(setFormatter)) {
            df = new DecimalFormat("#.000");
        } else {
            df = new DecimalFormat(setFormatter);
        }
        return new BigDecimal(df.format(d));
    }
    
   

    /**
     * @param d 原值
     * @param setFormatter 格式化字符串 示例："#.00"
     * @param defaultValue 默认值
     * @return 格式化后BigDecimal值，默认精确到三位小数
     */
    public static BigDecimal formatToDecimal(Double d, String setFormatter, BigDecimal defaultValue) {
        if (d == null) {
            return defaultValue;
        }
        DecimalFormat df;
        if (StringUtils.isEmpty(setFormatter)) {
            df = new DecimalFormat("#.000");
        } else {
            df = new DecimalFormat(setFormatter);
        }
        return new BigDecimal(df.format(d));
    }

    /**
     * @param value 原值
     * @param defaultValue 默认值
     * @return
     */
    public static Long integerToLong(Integer value, Long defaultValue) {
        if (value == null) {
            return defaultValue;
        }
        return value.longValue();
    }

    /**
     * @param value 原值
     * @param defaultValue 默认值
     * @return
     */
    public static Long stringToLong(String value, Long defaultValue) {
        if (StringUtils.isEmpty(value)) {
            return defaultValue;
        }
        try {
            return Long.valueOf(value);
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    /**
     * @param value 原值
     * @param defaultValue 默认值
     * @return
     */
    public static Integer stringToInteger(String value, Integer defaultValue) {
        if (StringUtils.isBlank(value)) {
            return defaultValue;
        }
        try {
            return Integer.valueOf(value.trim());
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    /**
     * @param value 原值
     * @param defaultValue 默认值
     * @return
     */
    public static BigDecimal longToBigDecimal(Long value, BigDecimal defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        return new BigDecimal(value);
    }

    /**
     * @param d 原值
     * @param setFormatter 格式化字符串 示例："#.00"
     * @return 格式化后BigDecimal值，默认精确到1位小数
     */
    public static BigDecimal formatToDecimal(BigDecimal d, String setFormatter) {
        if (d == null) {
            return null;
        }
        DecimalFormat df;
        if (StringUtils.isEmpty(setFormatter)) {
            df = new DecimalFormat("#.0");
        } else {
            df = new DecimalFormat(setFormatter);
        }
        return new BigDecimal(df.format(d));
    }
    
    public static BigDecimal formatToTwoDecimal(BigDecimal d) {   	
        DecimalFormat df = new DecimalFormat("#.00");;
        return new BigDecimal(df.format(d));
    }

    public String formatDouble(Double d) {
        if (d == null) {
            return null;
        }
        DecimalFormat df = new DecimalFormat("0.00");
        return df.format(d);
    }

    public String formatDouble(Double d, String formatter) {
        if (d == null) {
            return null;
        }
        DecimalFormat df;
        if (StringUtils.isEmpty(formatter)) {
            df = new DecimalFormat("0.00");
        } else {
            df = new DecimalFormat(formatter);
        }
        return df.format(d);
    }

    public String formatBigDecimal(BigDecimal d) {
        if (d == null) {
            return null;
        }
        DecimalFormat df = new DecimalFormat(",##0.00");
        df.setRoundingMode(RoundingMode.HALF_UP);
        return df.format(d);
    }

    /**
     * 相加
     *
     * @param d1
     * @param d2
     * @return
     */
    public BigDecimal add(Double d1, Double d2) {
        if (d1 == null || d2 == null) {
            return null;
        }
        BigDecimal b1 = new BigDecimal(d1.toString());
        BigDecimal b2 = new BigDecimal(d2.toString());
        return b1.add(b2);
    }

    /**
     * 相减
     *
     * @param d1
     * @param d2
     * @return
     */
    public BigDecimal subtract(Double d1, Double d2) {
        if (d1 == null || d2 == null) {
            return null;
        }
        BigDecimal b1 = new BigDecimal(d1.toString());
        BigDecimal b2 = new BigDecimal(d2.toString());
        return b1.subtract(b2);
    }
}
